﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using ChartDirector;

namespace BDSim.用户界面.UserControls
{
    /// <summary>
    /// UC_HeatMap.xaml 的交互逻辑
    /// </summary>
    public partial class UC_HeatMap : UserControl
    {
        public UC_HeatMap()
        {
            InitializeComponent();
        }

        #region 填充颜色(填充全部网格)
        /// <summary>
        /// 填充颜色(填充全部网格)
        /// </summary>
        /// <param name="colorValue">经纬度处的颜色值</param>
        public void FillColors(double[,] evaluationData)
        {
            int lonNum = evaluationData.GetLength(0);//经度数目
            int latNum = evaluationData.GetLength(1);//纬度数目

            int rowNum = latNum;//行数
            int colNum = lonNum;//列数

            double[] xData = new double[rowNum];
            double[] yData = new double[rowNum];
            double[] zData = new double[rowNum * colNum];
            for (int colIndex = 0; colIndex < colNum; colIndex++)
            {
                yData[colIndex] = colIndex - 36;
                for (int rowIndex = 0; rowIndex < rowNum; rowIndex++)
                {
                    xData[rowIndex] = rowIndex - 36;
                    zData[colIndex * rowNum + rowIndex] = evaluationData[rowIndex, colIndex];
                }
            }
            
            createChart(chartViewer1, xData, yData, zData);
        }
        #endregion

        void createChart(WinChartViewer viewer, double[] dataX, double[] dataY, double[] dataZ)
        {
            // The x and y coordinates of the grid
            //double[] dataX = {-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
            //    10};
            //double[] dataY = {-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
            //    10};

            // The values at the grid points. In this example, we will compute the values using the
            // formula z = x * sin(y) + y * sin(x).
            //double[] dataZ = new double[dataX.Length * dataY.Length];
            //for (int yIndex = 0; yIndex < dataY.Length; ++yIndex)
            //{
            //    double y = dataY[yIndex];
            //    for (int xIndex = 0; xIndex < dataX.Length; ++xIndex)
            //    {
            //        double x = dataX[xIndex];
            //        dataZ[yIndex * dataX.Length + xIndex] = x * Math.Sin(y) + y * Math.Sin(x);
            //    }
            //}

            // Create a XYChart object of size 600 x 500 pixels
            XYChart c = new XYChart(1565, 764);

            // Add a title to the chart using 15 points Arial Bold Italic font
            c.addTitle("z = x * sin(y) + y * sin(x)      ", "Arial Bold Italic", 15);

            // Set the plotarea at (75, 40) and of size 400 x 400 pixels. Use semi-transparent black
            // (80000000) dotted lines for both horizontal and vertical grid lines
            c.setPlotArea(0, 0, 1565, 764, -1, -1, -1, c.dashLineColor(unchecked((int)0x80000000),
                Chart.DotLine), -1);

            // Set x-axis and y-axis title using 12 points Arial Bold Italic font
            c.xAxis().setTitle("X-Axis Title Place Holder", "Arial Bold Italic", 12);
            c.yAxis().setTitle("Y-Axis Title Place Holder", "Arial Bold Italic", 12);

            // Set x-axis and y-axis labels to use Arial Bold font
            c.xAxis().setLabelStyle("Arial Bold");
            c.yAxis().setLabelStyle("Arial Bold");

            // When auto-scaling, use tick spacing of 40 pixels as a guideline
            c.yAxis().setTickDensity(40);
            c.xAxis().setTickDensity(40);

            // Add a contour layer using the given data
            ContourLayer layer = c.addContourLayer(dataX, dataY, dataZ);

            // Move the grid lines in front of the contour layer
            c.getPlotArea().moveGridBefore(layer);

            // Add a color axis (the legend) in which the top left corner is anchored at (505, 40).
            // Set the length to 400 pixels and the labels on the right side.
            ColorAxis cAxis = layer.setColorAxis(505, 40, Chart.TopLeft, 400, Chart.Right);

            // Add a title to the color axis using 12 points Arial Bold Italic font
            cAxis.setTitle("Color Legend Title Place Holder", "Arial Bold Italic", 12);

            // Set color axis labels to use Arial Bold font
            cAxis.setLabelStyle("Arial Bold");

            // Output the chart
            viewer.Chart = c;
        }
    }
}
